
package com.shop.cereshop.app.dao.wallet;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shop.cereshop.app.domain.wallet.UserIncomeAndExpenseDTO;
import com.shop.cereshop.commons.domain.wallet.WalletTransaction;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 钱包流水DAO接口
 * @author wang.yao
 * @date 2025-08-26
 */
@Mapper
public interface WalletTransactionDAO extends BaseMapper<WalletTransaction> {

    /**
     * 查询钱包流水列表
     * @param buyerUserId 用户ID
     * @param transactionType 交易类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 流水列表
     */
    List<WalletTransaction> selectTransactionList(@Param("buyerUserId") Long buyerUserId,
                                                 @Param("transactionType") String transactionType,
                                                 @Param("startDate") String startDate,
                                                 @Param("endDate") String endDate,
                                                 @Param("minAmount") BigDecimal minAmount,
                                                 @Param("maxAmount") BigDecimal maxAmount,
                                                 @Param("offset") Integer offset,
                                                 @Param("limit") Integer limit);

    /**
     * 获取用户收入和支出
     * @param buyerUserId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 收入和支出
     */
    UserIncomeAndExpenseDTO getUserIncomeAndExpense(@Param("buyerUserId") Long buyerUserId,
                                                    @Param("startDate") String startDate,
                                                    @Param("endDate") String endDate);



    /**
     * 查询钱包流水总数
     * @param buyerUserId 用户ID
     * @param transactionType 交易类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @return 总数
     */
    int countTransactions(@Param("buyerUserId") Long buyerUserId,
                         @Param("transactionType") String transactionType,
                         @Param("startDate") String startDate,
                         @Param("endDate") String endDate,
                         @Param("minAmount") BigDecimal minAmount,
                         @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 根据ID查询钱包流水详情
     * @param transactionId 流水ID
     * @return 流水详情
     */
    WalletTransaction selectTransactionById(@Param("transactionId") Long transactionId);

    /**
     * 根据订单号查询钱包流水
     * @param orderNo 订单号
     * @return 流水详情
     */
    WalletTransaction selectTransactionByOrderNo(@Param("orderNo") String orderNo);
}
